﻿#ifndef MEMSDATAHANDLER_H
#define MEMSDATAHANDLER_H

#include <qobject.h>
#include "qvector.h"
#include "qtimer.h"
#include "qhash.h"

class MEMSDataCodec;
class LogSaver;

class MEMSDataHandler : public QObject
{
  Q_OBJECT

  //状态位
public:
  enum DataCollectionProtocol
  {
    Protocol_SingleTemperature,
    Protocol_DoubleTemperature
  };

private:
  QTimer timer_collection;//求平均的计时器
  int interval_collection = 1000;//求平均的间隔时间（毫秒）
  bool isListen= false;
  QHash<int,int> count_dataNumber;//数据数量计数器,记录每组数据的数量，用于最后求平均
  QHash<int,QVector<float>> dataGroup_float;//要保存到文件的浮点数据
  DataCollectionProtocol dataCollectionProtocol = Protocol_SingleTemperature;//默认为单温度协议

  MEMSDataCodec* mEMSDataCodec = Q_NULLPTR;
  LogSaver* logSaver = Q_NULLPTR;
public:
  MEMSDataHandler(QObject* parent = Q_NULLPTR);
  ~MEMSDataHandler();

signals:
  void signal_dataHandled(int dataGroupIndex, QVector<float> data, DataCollectionProtocol dataCollectionProtocol);
  void signal_currentDataCollectionState(bool collectionState);
  void signal_currentDataCollectionProtocol(DataCollectionProtocol dataCollectionProtocol);
public slots:
  void slot_handleData(int dataGroupIndex, QByteArray data);
  void slot_startDataCollection();
  void slot_stopDataCollection();

  //不同的数据处理协议
private:
  //Protocol_SingleTemperature协议，数据部分顺序依次为
  //Acc X H8、Acc X L8、Acc Y H8、Acc Y L8、Acc Z H8、	Acc Z L8、Gyro X H8
  //Gyro X L8、Gyro Y H8、Gyro Y L8、Gyro Z H8、Gyro Z L8、	Temp H8、Temp L8
  void calc_singleTemperature(int dataGroupIndex, QByteArray data);
  void protocol_singleTemperature(int dataGroupIndex);
private:
  //Protocol_DoubleTemperature协议，数据部分顺序依次为
  //Acc X H8、Acc X L8、Acc Y H8、Acc Y L8、Acc Z H8、Acc Z L8、Gyro X H8
  //Gyro X L8、Gyro Y H8、Gyro Y L8、Gyro Z H8、Gyro Z L8、Temp_ACC、Temp_GYR
  void calc_doubleTemperature(int dataGroupIndex, QByteArray data);
  void protocol_doubleTemperature(int dataGroupIndex);

  //代码优化，模块化
private:
  void processingData(int dataGroupIndex);
  void clearAllGroup();
  void clearGroup(int groupIndex);
  short char2ToShort(char H8, char L8);
  float calcAve(float oldSum,float newValue,float numCount);
private slots:
  void slot_timer_ave_timeOut();

public:
  int getInterval_collection();
  void setInterval_collection(int interval_collection);
  bool getIsListen();
  void setIsListen(bool isListen);
  DataCollectionProtocol getDataCollectionProtocol();
  void setDataCollectionProtocol(DataCollectionProtocol dataCollectionProtocol);
  MEMSDataCodec* getMEMSDataCodec();
  void setMEMSDataCodec(MEMSDataCodec* mEMSDataCodec);
  LogSaver* getLogSaver();
  void setLogSaver(LogSaver* logSaver);
};
#endif
